﻿using System;
using System.Windows.Forms;
using DatabaseManager.Infrastructure.Configuration;
using DatabaseManager.Infrastructure.Connections;
using DatabaseManager.Utilities;
using SqlSugar;

namespace DatabaseManager.WinForms.Services
{
    public class DbConnectionService
    {
        private readonly IConfigurationProvider _configProvider;
        private readonly IDatabaseConnectionFactory _connectionFactory;
        private ISqlSugarClient _dbClient;

        // 新增：存储最后一次异常
        private Exception _lastException;
        public Exception GetLastException() => _lastException;

        public DbConnectionService(IConfigurationProvider configProvider,
                                  IDatabaseConnectionFactory connectionFactory)
        {
            _configProvider = configProvider ?? throw new ArgumentNullException(nameof(configProvider));
            _connectionFactory = connectionFactory ?? throw new ArgumentNullException(nameof(connectionFactory));

            // 初始化MySQL配置（适配MySql.Data驱动，无需额外设置）
        }

        public DbConnectionService()
        {
            // 初始化配置提供者
            _configProvider = new AppSettingsConfigurationProvider();

            // 获取连接字符串
            string connectionString = _configProvider.GetSystemConnectionString();
            if (string.IsNullOrWhiteSpace(connectionString))
            {
                //MessageBox.Show("连接字符串为空，请检查配置文件", "配置错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            // 初始化连接工厂和连接服务
            _connectionFactory = new DatabaseConnectionFactory(connectionString);

        }

        /// <summary>
        /// 建立系统数据库连接
        /// </summary>
        /// <returns>是否连接成功</returns>
        public bool Connect()
        {
            try
            {
                if (_dbClient == null)
                {
                    // 创建连接前验证连接字符串
                    var connectionString = _configProvider.GetSystemConnectionString();
                    if (string.IsNullOrWhiteSpace(connectionString))
                    {
                        throw new InvalidOperationException("数据库连接字符串为空，请检查配置");
                    }

                    // 创建连接
                    _dbClient = _connectionFactory.CreateSystemConnection();

                    // 验证数据库类型
                    if (_dbClient.CurrentConnectionConfig.DbType != SqlSugar.DbType.MySqlConnector)
                    {
                        var actualDbType = _dbClient.CurrentConnectionConfig.DbType.ToString();
                        throw new InvalidOperationException($"数据库类型配置错误，应为MySQL，实际为: {actualDbType}");
                    }
                }

                // 测试连接
                var testResult = _dbClient.Ado.GetScalar("SELECT 1");

                _lastException = null; // 连接成功时清空异常

                return testResult != null && testResult.ToString() == "1";
            }
            catch (Exception ex)
            {
                _lastException = ex; // 记录异常
               
                // 解析异常详情（错误号、完整消息）
                string errorCode = "N/A";
                string fullMessage = ex.Message;
                Exception innerEx = ex;

                // 递归查找最内层的 MySQL 异常（可能有多层包装）
                while (innerEx != null)
                {
                    //// 处理 MySql.Data 驱动的异常
                    //if (innerEx is MySql.Data.MySqlClient.MySqlException mySqlEx)
                    //{
                    //    errorCode = mySqlEx.Number.ToString(); // MySQL 错误号（关键标识）
                    //    fullMessage = $"MySQL错误 {mySqlEx.Number}: {mySqlEx.Message}";
                    //    break;
                    //}
                    // 处理 MySqlConnector 驱动的异常
                    if (innerEx is MySqlConnector.MySqlException connectorEx)
                    {
                        errorCode = connectorEx.Number.ToString(); // 错误号
                        fullMessage = $"MySQL错误 {connectorEx.Number}: {connectorEx.Message}";
                        break;
                    }
                    // 处理 SqlSugar 自身的异常
                    else if (innerEx is SqlSugar.SqlSugarException sugarEx)
                    {
                        fullMessage = $"SqlSugar错误: {sugarEx.Message}";
                    }

                    innerEx = innerEx.InnerException;
                }

                // 格式化包含日期、错误号、完整消息的日志
                string logMessage = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] 数据库连接失败 | 错误号: {errorCode} | 详情: {fullMessage}";
                System.Diagnostics.Trace.WriteLine(logMessage);

                return false;
            }
        }

        // 其他方法保持不变...
        public ISqlSugarClient GetDbClient()
        {
            if (_dbClient == null || !Connect())
            {
                throw new InvalidOperationException("数据库连接未建立或已断开");
            }
            return _dbClient;
        }

        public void Disconnect()
        {
            if (_dbClient != null)
            {
                _dbClient.Dispose();
                _dbClient = null;
            }
        }

        /// <summary>
        /// 数据库连接测试
        /// </summary>
        public void ConnectTest()
        {
            try
            {
                // 测试连接（通过 Connect 内部的异常捕获获取详细错误）
                if (!Connect())
                {
                    if (_lastException != null)
                    {
                        // 识别数据库关闭 / 无法连接的典型异常信息
                        if (DbExceptionHelper.IsDatabaseShutdownException(_lastException))
                        {
                            MessageBox.Show("1.数据库服务未启动或已关闭，请检查 MySQL 服务状态.\r\n2.数据库连接字符串配置错误（如服务器地址、端口错误）.",
                            "数据库未运行", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                        else if (DbExceptionHelper.IsConnectionStringError(_lastException))
                        {
                            MessageBox.Show("连接字符串配置错误（如服务器地址、端口错误）",
                            "配置错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                        else if (DbExceptionHelper.IsPermissionError(_lastException))
                        {
                            MessageBox.Show("数据库账号密码错误或权限不足",
                            "认证失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                        else
                        {
                            MessageBox.Show($"连接失败：{_lastException.Message}",
                            "连接错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                    else
                    {
                        MessageBox.Show("无法连接到数据库，请检查配置",
                        "连接错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    return;
                }

                MessageBox.Show("数据库连接成功！", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                MessageBox.Show($"测试过程发生错误：{ex.Message}", "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
                
    }
}
